Next.jsã¬ã€ã¢ãŠããæŽ»çšããå ç¢ã§ã¹ã±ãŒã©ãã«ãªã°ããŒãã«å¯Ÿå¿ã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããæ¹æ³ãåŠã³ãŸããããå ±æUIã³ã³ããŒãã³ãã®ãã¹ããã©ã¯ãã£ã¹ã玹ä»ããŸãã
Next.js Layouts: ã°ããŒãã«ã¢ããªã±ãŒã·ã§ã³åãå ±æUIã³ã³ããŒãã³ããã¿ãŒã³ã®ç¿åŸ
\n\nNext.jsã¯ãããã©ãŒãã³ã¹ãé«ããŠãŒã¶ãŒãã¬ã³ããªãŒãªã¢ããªã±ãŒã·ã§ã³ã®äœæãå¹çåãããã®èœåã§ãçŸä»£ã®ãŠã§ãéçºã®èŠç³ãšãªã£ãŠããŸãããã®èœåã®äžå¿ã«ããã®ãUIã³ã³ããŒãã³ãã®å¹æçãªç®¡çã§ããããã®æ žå¿ã«ã¯Next.jsã¬ã€ã¢ãŠãã®åãååšããŸãããã®å æ¬çãªã¬ã€ãã§ã¯ãNext.jsã¬ã€ã¢ãŠããæŽ»çšããŠãå ç¢ã§ã¹ã±ãŒã©ãã«ãªã°ããŒãã«å¯Ÿå¿ã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããéã®è€éãªç¹ãæ·±ãæãäžããŸããã³ãŒãã®åå©çšæ§ãä¿å®æ§ããããŠäžçäžã®ãŠãŒã¶ãŒã«ã·ãŒã ã¬ã¹ãªãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãæäŸããå ±æUIã³ã³ããŒãã³ããäœæããããã®ãã¹ããã©ã¯ãã£ã¹ãæ¢æ±ããŸãã
\n\nNext.jsã«ãããã¬ã€ã¢ãŠãã®éèŠæ§ãçè§£ãã
\n\nãŠã§ãéçºã®é åãç¹ã«Next.jsã®ãããªãã¬ãŒã ã¯ãŒã¯ã§ã¯ãã¬ã€ã¢ãŠãã¯ã¢ããªã±ãŒã·ã§ã³ã®ãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ãŒã¹ãæ§ç¯ããã建ç¯çåºç€ãšããŠæ©èœããŸãããããã¯ãå šäœçãªãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ã圢äœãäžè²«æ§ã®ããåå©çšå¯èœãªUIèŠçŽ ã®èšèšå³ã§ããé©åã«æ§é åãããã¢ããªã±ãŒã·ã§ã³èšèšã§ã¬ã€ã¢ãŠãã«ã€ããŠèããããšã§ãéçºè ã¯ã³ãŒãã®éè€ãé¿ããä¿å®ãç°¡çŽ åã§ããŸããæ¬è³ªçã«ãã¬ã€ã¢ãŠãã¯ä»¥äžã®ããã®ãã¬ãŒã ã¯ãŒã¯ãæäŸããŸãã
\n\n- \n
- äžè²«æ§ã®ãããã©ã³ãã£ã³ã°: ãã¹ãŠã®ããŒãžã§çµ±äžãããèŠèŠçã¢ã€ãã³ãã£ãã£ãç¶æããŸãã \n
- å ±æããã²ãŒã·ã§ã³: è€æ°ã®ããŒãžã«è¡šç€ºãããããã²ãŒã·ã§ã³ã¡ãã¥ãŒãããã¿ãŒããã®ä»ã®æ°žç¶çãªUIèŠçŽ ãå®è£ ãã管çããŸãã \n
- ã³ãŒãã®åå©çšæ§: åãUIããžãã¯ãç¹°ãè¿ãèšè¿°ããå¿ èŠããªããªããŸãã \n
- SEOæé©å: ãµã€ãå šäœã§äžè²«ããã¡ã¿ã¿ã°ãã¿ã€ãã«ã¿ã°ããã®ä»ã®SEOèŠçŽ ãé©çšããæ€çŽ¢ãšã³ãžã³ã®ã©ã³ãã³ã°åäžã«è²¢ç®ããŸãã \n
- ããã©ãŒãã³ã¹ã®åäž: Next.jsãæäŸãããµãŒããŒãµã€ãã¬ã³ããªã³ã°ïŒSSRïŒãéçãµã€ãçæïŒSSGïŒãªã©ã®æ©èœãæé©ãªã³ã³ããŒãã³ãæ§æã§æŽ»çšããŸãã \n
Next.jsã¬ã€ã¢ãŠãã®äž»èŠãªæŠå¿µãšå©ç¹
\n\n1. The `_app.js`ããã³`_document.js`ãã¡ã€ã«
\n\nNext.jsã§ã¯ã`_app.js`ãš`_document.js`ãšãã2ã€ã®ç¹å¥ãªãã¡ã€ã«ããã¬ã€ã¢ãŠããšã°ããŒãã«èšå®ã®å®çŸ©ã«ãããŠéèŠãªåœ¹å²ãæãããŸãããããã®ç®çãçè§£ããããšã¯åºæ¬ã§ãã
\n\n- \n
_app.js
: ããã¯ãã¢ããªã±ãŒã·ã§ã³å ã®ä»ã®ãã¹ãŠã®ããŒãžãã©ãããããããã¬ãã«ã®ã³ã³ããŒãã³ãã§ããéåžžããã®ãã¡ã€ã«ã¯ä»¥äžã®ç®çã§äœ¿çšããŸãã\n- \n
- ã°ããŒãã«CSSãŸãã¯ã¹ã¿ã€ã«ã³ã³ããŒãã³ããåæåããã \n
- ã³ã³ããã¹ããããã€ããŒã䜿çšããŠã³ã³ããŒãã³ãã«ããŒã¿ãæäŸããã \n
- ReduxãZustandãªã©ã®ãããã€ããŒã§ã¢ããªã±ãŒã·ã§ã³ãã©ããããç¶æ 管çãè¡ãã \n
- æ°žç¶çãªããããŒãããã¿ãŒãªã©ããã¹ãŠã®ããŒãžã«é©çšãããã°ããŒãã«ã¬ã€ã¢ãŠããå®çŸ©ããã \n
\n _document.js
: ããã¯ãHTMLããã¥ã¡ã³ãèªäœã®ãµãŒããŒãµã€ãã¬ã³ããªã³ã°ãå¶åŸ¡ã§ãããããé«åºŠãªèšå®ãã¡ã€ã«ã§ãããã®ãã¡ã€ã«ã䜿çšãããšã<html>
ã<head>
ã<body>
ã¿ã°ã倿Žã§ããŸããäž»ã«ãããè€éãªSEOããã³ããã©ãŒãã³ã¹æé©åã«äœ¿çšãããŸããéåžžã`_document.js`ã¯ä»¥äžã®ç®çã§äœ¿çšããŸãã \n - å€éšãã©ã³ããã¹ã¯ãªãããã¹ã¿ã€ã«ã·ãŒããå«ããã \n
- HTMLããã¥ã¡ã³ãã®ããã©ã«ãæ§é ãèšå®ããã \n
- ãµãŒããŒãµã€ãã¬ã³ããªã³ã°ããã»ã¹ãã«ã¹ã¿ãã€ãºããã \n
- \n
2. ã¬ã€ã¢ãŠãã䜿çšããå©ç¹
\n\nã¬ã€ã¢ãŠããæ¡çšããããšã¯ãç¹ã«å€§èŠæš¡ã§è€éãªãŠã§ãã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããéã«ãå€ãã®å©ç¹ããããããŸãã
\n\n- \n
- ã³ãŒãæ§æã®æ¹å: UIã³ã³ããŒãã³ããåå©çšå¯èœãªã¢ãžã¥ãŒã«ã«åé¢ããããšã§ãã³ãŒãã®å¯èªæ§ãšä¿å®æ§ãåäžããŸãã \n
- ä¿å®ã®ç°¡çŽ å: 倿Žãå¿ èŠãªå Žåãã¬ã€ã¢ãŠãã³ã³ããŒãã³ããæŽæ°ããã ãã§ããã®å€æŽãã¢ããªã±ãŒã·ã§ã³å šäœã«åæ ãããŸãã \n
- ããã©ãŒãã³ã¹ã®åäž: ã¬ã€ã¢ãŠãã¯ã³ã³ãã³ãã®é ä¿¡ãæé©åããããŒãžã®èªã¿èŸŒã¿æéãççž®ãããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãåäžãããŸãã \n
- äžè²«æ§ã®ãããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹: äžè²«æ§ã®ããã¬ã€ã¢ãŠãã¯ããŠãŒã¶ãŒãã¢ããªã±ãŒã·ã§ã³å ãç§»åããéã«æ £ã芪ããã ãšã¯ã¹ããªãšã³ã¹ãæã€ããšãä¿èšŒããŸãã \n
- SEOã®å©ç¹: äžè²«ããHTMLæ§é ãšã¡ã¿ã¿ã°ïŒå€ãã®å Žåã¬ã€ã¢ãŠãå ã§ç®¡çãããŸãïŒã¯ãæ€çŽ¢ãšã³ãžã³ã®ã©ã³ãã³ã°ãšèŠèªæ§ãåäžãããŸãã \n
å ±æUIã³ã³ããŒãã³ããã¿ãŒã³ã®å®è£
\n\n1. åºæ¬çãªã¬ã€ã¢ãŠãã³ã³ããŒãã³ãã®äœæ
\n\nã·ã³ãã«ãªã¬ã€ã¢ãŠãã³ã³ããŒãã³ããäœæããŠã¿ãŸãããããã®ã³ã³ããŒãã³ãã«ã¯ãããããŒãã¡ã€ã³ã³ã³ãã³ããšãªã¢ãããã¿ãŒãå«ãŸããŸããè€æ°ã®ããŒãžã§å ±æã§ããããã«èšèšãããŠããŸãã
\n\n
// components/Layout.js\nimport Head from 'next/head';\n\nfunction Layout({ children, title }) {\n return (\n <>\n <Head>\n <title>{title} | My App</title>\n <meta name=\"description\" content=\"My Next.js App\" />\n </Head>\n <header>\n <h1>My App Header</h1>\n </header>\n <main>{children}</main>\n <footer>\n <p>© {new Date().getFullYear()} My App. All rights reserved.</p>\n </footer>\n </>\n );\n}\n\nexport default Layout;\n
ãã®äŸã§ã¯ã`Layout`ã³ã³ããŒãã³ãã¯`children`ãš`title`ãpropsãšããŠåãåããŸãã`children`ã¯ã¬ã€ã¢ãŠãå ã§ã¬ã³ããªã³ã°ãããããŒãžã®ã³ã³ãã³ãã衚ãã`title`ã¯SEOã®ããã«ããŒãžã®ã¿ã€ãã«ã¿ã°ãèšå®ããŸãã
\n\n2. ããŒãžã§ã®ã¬ã€ã¢ãŠãã³ã³ããŒãã³ãã®äœ¿çš
\n\n次ã«ããã®ã¬ã€ã¢ãŠããããããã®ããŒãžïŒäŸ: `pages/index.js`ïŒã«é©çšããŠã¿ãŸãããã
\n\n
// pages/index.js\nimport Layout from '../components/Layout';\n\nfunction HomePage() {\n return (\n <Layout title=\"Home\">\n <h2>Welcome to the Home Page</h2>\n <p>This is the main content of the home page.</p>\n </Layout>\n );\n}\n\nexport default HomePage;\n
`pages/index.js`ã§ã¯ã`Layout`ã³ã³ããŒãã³ããã€ã³ããŒããããã®äžã«ããŒãžã³ã³ãã³ããã©ããããŠããŸãããŸããããŒãžåºæã®`title`ãæäŸããŠããŸãã`Layout`ã³ã³ããŒãã³ãã®`children` propã¯ã`index.js`ã®`<Layout>`ã¿ã°éã®ã³ã³ãã³ãã§åããããŸãã
\n\n3. é«åºŠãªã¬ã€ã¢ãŠãæ©èœ
\n\n- \n
- åçãªããŒã¿ãã§ãã: `getServerSideProps`ãŸãã¯`getStaticProps`ã䜿çšããŠãã¬ã€ã¢ãŠãã³ã³ããŒãã³ãå ã§ããŒã¿ããã§ããã§ããŸããããã«ãããããŒã¿ãœãŒã¹ããããããŒãããã²ãŒã·ã§ã³ã«ããŒã¿ãæ³šå ¥ã§ããŸãã \n
- ã³ã³ããã¹ããããã€ããŒ: Reactã³ã³ããã¹ããæŽ»çšããŠãã¬ã€ã¢ãŠãã§ã©ãããããã³ã³ããŒãã³ãéã§ç¶æ ãšããŒã¿ãå ±æããŸããããã¯ãããŒãããŠãŒã¶ãŒèªèšŒããã®ä»ã®ã°ããŒãã«ãªã¢ããªã±ãŒã·ã§ã³ç¶æ ã管çããããã«äžå¯æ¬ ã§ãã \n
- æ¡ä»¶ä»ãã¬ã³ããªã³ã°: ãŠãŒã¶ãŒèªèšŒãç»é¢ãµã€ãºããã®ä»ã®èŠå ã«å¿ããŠç°ãªãUIèŠçŽ ã衚瀺ããããã«ãã¬ã€ã¢ãŠãå ã§æ¡ä»¶ä»ãã¬ã³ããªã³ã°ãå®è£ ããŸãã \n
- ã¹ã¿ã€ãªã³ã°: CSS-in-JSïŒäŸ: styled-componentsãEmotionïŒãCSSã¢ãžã¥ãŒã«ããŸãã¯ãã¬ãŒã³ãªCSSãã¬ã€ã¢ãŠãã³ã³ããŒãã³ãå ã«çŽæ¥çµã¿èŸŒã¿ãŸãã \n
åœéçãªã¢ããªã±ãŒã·ã§ã³ã®ããã®ã°ããŒãã«ãªèæ ®äºé
\n\nã°ããŒãã«ãªãŠãŒã¶ãŒåãã®ã¬ã€ã¢ãŠããäœæããéã«ã¯ãããã€ãã®åœéåããã³ã°ããŒãã«åïŒi18n/g11nïŒã®åŽé¢ãèæ ®ããããšãéèŠã§ãããããã®ãã©ã¯ãã£ã¹ã¯ãã¢ããªã±ãŒã·ã§ã³ã倿§ãªæåçèæ¯ãæã€å人ã«ãšã£ãŠã¢ã¯ã»ã·ãã«ã§äœ¿ãããããã®ã§ããããšãä¿èšŒããŸãã
\n\n1. åœéåïŒi18nïŒãšããŒã«ãªãŒãŒã·ã§ã³ïŒl10nïŒ
\n\n- \n
- i18n (åœéå): ã¢ããªã±ãŒã·ã§ã³ãç°ãªãèšèªãå°åã«é©å¿ã§ããããã«èšèšããŸããããã«ã¯ãããã¹ãã®æœè±¡åãæ¥ä»ãšæ°å€åœ¢åŒã®åŠçãç°ãªãæåã»ããã®ãµããŒããå«ãŸããŸãã \n
- l10n (ããŒã«ãªãŒãŒã·ã§ã³): èšèªç¿»èš³ãé貚圢åŒãæ¥ä»/æå»åœ¢åŒãæåçå奜ãªã©ãã¢ããªã±ãŒã·ã§ã³ãç¹å®ã®ãã±ãŒã«ã«é©å¿ãããŸãã \n
2. Next.jsã¬ã€ã¢ãŠãã«ãããi18nã®å®è£
\n\nNext.jsã§i18nãå®è£ ããã«ã¯ã`next-i18next`ã®ãããªæ§ã ãªã©ã€ãã©ãªããã«ãŒãã£ã³ã°ããŒã¹ã®ãœãªã¥ãŒã·ã§ã³ã®ããã®çµã¿èŸŒã¿ã®`next/router`ã䜿çšã§ããŸãã
\n\n`_app.js`ãã¡ã€ã«ã䜿çšãã`next-i18next`ã®ç°¡ç¥åãããäŸã次ã«ç€ºããŸããããã«ãããã¢ããªã±ãŒã·ã§ã³ã¬ãã«ã§i18nãèšå®ãããŸãã`npm install i18next react-i18next next-i18next`ã䜿çšããŠå¿ èŠãªããã±ãŒãžãã€ã³ã¹ããŒã«ãããŠããããšã確èªããŠãã ããããã®äŸã¯ç°¡ç¥åãããçµ±åã瀺ããŠãããç¹å®ã®èŠä»¶ã«åºã¥ããŠèª¿æŽãå¿ èŠã«ãªãå ŽåããããŸãã
\n\n
// _app.js\nimport { appWithTranslation } from 'next-i18next';\nimport '../styles/global.css'; // Import your global styles\n\nfunction MyApp({ Component, pageProps }) {\n return <Component {...pageProps} />;\n}\n\nexport default appWithTranslation(MyApp);\n
ãã®`_app.js`ã§ã¯ã`appWithTranslation`ãã¢ããªã±ãŒã·ã§ã³ã«åœéåã³ã³ããã¹ããæäŸããŸãã
\n\n次ã«ãã¬ã€ã¢ãŠãã§`react-i18next`ãæäŸãã`useTranslation`ããã¯ã䜿çšããŸãã
\n\n
// components/Layout.js\nimport { useTranslation } from 'react-i18next';\nimport Head from 'next/head';\n\nfunction Layout({ children, title }) {\n const { t } = useTranslation(); // Get the translate function\n\n return (\n <>\n <Head>\n <title>{t('layout.title', { title })}</title>\n <meta name=\"description\" content={t('layout.description')} />\n </Head>\n <header>\n <h1>{t('layout.header')}</h1>\n </header>\n <main>{children}</main>\n <footer>\n <p>{t('layout.footer', { year: new Date().getFullYear() })}</p>\n </footer>\n </>\n );\n}\n\nexport default Layout;\n
翻蚳ãã¡ã€ã«ã¯éåžžã`public/locales/[locale]/[namespace].json`æ§é ã§ä¿åãããŸããããšãã°ã`public/locales/en/common.json`ã«ã¯æ¬¡ã®å 容ãå«ãŸããå ŽåããããŸãã
\n\n
{\n \"layout\": {\n \"title\": \"{{title}} | My App\",\n \"description\": \"My Next.js App Description\",\n \"header\": \"My App Header\",\n \"footer\": \"© {{year}} My App. All rights reserved.\"\n }\n}\n
ãããŠã`public/locales/fr/common.json`ïŒãã©ã³ã¹èªçšïŒã«ã¯æ¬¡ã®å 容ãå«ãŸããå ŽåããããŸãã
\n\n
{\n \"layout\": {\n \"title\": \"{{title}} | Mon Application\",\n \"description\": \"Description de mon application Next.js\",\n \"header\": \"En-tête de mon application\",\n \"footer\": \"© {{year}} Mon application. Tous droits réservés.\"\n }\n}\n
泚: ãã®äŸã¯i18nçµ±åã®åºæ¬çãªã¢ãããŒããæäŸããŠããã远å ã®èšå®ïŒäŸ: èšèªæ€åºãã«ãŒãã£ã³ã°èšå®ïŒãå¿ èŠã§ããå æ¬çãªã¬ã€ãã³ã¹ã«ã€ããŠã¯ã`next-i18next`ã®ããã¥ã¡ã³ããåç §ããŠãã ããã
\n\n3. ã¬ã¹ãã³ã·ããã¶ã€ã³ãšã¬ã€ã¢ãŠã
\n\nã¬ã¹ãã³ã·ããã¶ã€ã³ã¯ã°ããŒãã«ãªãŠãŒã¶ãŒã«ãšã£ãŠäžå¯æ¬ ã§ããã¬ã€ã¢ãŠãã¯ããŸããŸãªç»é¢ãµã€ãºãããã€ã¹ã«é©å¿ããå¿ èŠããããŸããBootstrapãTailwind CSSãªã©ã®CSSãã¬ãŒã ã¯ãŒã¯ãå©çšããããã«ã¹ã¿ã ã¡ãã£ã¢ã¯ãšãªãäœæããŠããã¹ãŠã®ããã€ã¹ã§äžè²«ãããŠãŒã¶ãŒãã¬ã³ããªãŒãªãšã¯ã¹ããªãšã³ã¹ã確ä¿ããŠãã ããã
\n\n4. ã¢ã¯ã»ã·ããªãã£ã®èæ ®äºé
\n\nã¢ã¯ã»ã·ããªãã£ã¬ã€ãã©ã€ã³ïŒWCAGïŒãéµå®ããé害ãæã€äººã ãã¢ããªã±ãŒã·ã§ã³ã䜿çšã§ããããã«ããŸããããã«ã¯ä»¥äžãå«ãŸããŸãã
\n\n- \n
- ã»ãã³ãã£ãã¯HTML: ã»ãã³ãã£ãã¯HTMLèŠçŽ ïŒ
<nav>
ã<article>
ã<aside>
ïŒã䜿çšããŠãã³ã³ãã³ããè«ççã«æ§é åããŸãã \n - ç»åã®ä»£æ¿ããã¹ã: ç»åã«ã¯åžžã«èª¬æçãª`alt`屿§ãæäŸããŸãã \n
- ããŒããŒãããã²ãŒã·ã§ã³: ã¢ããªã±ãŒã·ã§ã³ãããŒããŒãã®ã¿ã§æäœã§ããããšã確èªããŸãã \n
- è²ã®ã³ã³ãã©ã¹ã: ããã¹ããšèæ¯ã®éã«ååãªè²ã®ã³ã³ãã©ã¹ããç¶æããŸãã \n
- ARIA屿§: å¿ èŠã«å¿ããŠARIA屿§ã䜿çšããŠã¢ã¯ã»ã·ããªãã£ã匷åããŸãã \n
5. æ¥ä»ãšæå»ã®åœ¢åŒèšå®
\n\nå°åã«ãã£ãŠæ¥ä»ãšæå»ã®åœ¢åŒã«ã¯ç°ãªãæ £ç¿ããããŸãããŠãŒã¶ãŒã®ãã±ãŒã«ã«åºã¥ããŠæ¥ä»ãšæå»ãæ£ãã衚瀺ãããããã«ããŸãã`date-fns`ã®ãããªã©ã€ãã©ãªãJavaScriptã«çµã¿èŸŒãŸããŠãã`Intl` APIã§ãããåŠçã§ããŸãã
\n\n
import { format } from 'date-fns';\nimport { useTranslation } from 'react-i18next';\n\nfunction MyComponent() {\n const { i18n } = useTranslation();\n const currentDate = new Date();\n const formattedDate = format(currentDate, 'MMMM d, yyyy', { locale: i18n.language });\n\n return <p>{formattedDate}</p>;\n}\n
6. é貚ã®åœ¢åŒèšå®
\n\nåãã±ãŒã«ã§æ£ãã圢åŒã§éé¡ã衚瀺ããŸãã`Intl.NumberFormat` APIã¯é貚ã®åœ¢åŒèšå®ãåŠçããã®ã«åœ¹ç«ã¡ãŸãã
\n\n
function MyComponent() {\n const { i18n } = useTranslation();\n const price = 1234.56;\n const formattedPrice = new Intl.NumberFormat(i18n.language, { // Use i18n.language for locale\n style: 'currency',\n currency: 'USD', // Or dynamically determine the currency based on user preferences\n }).format(price);\n\n return <p>{formattedPrice}</p>\n}\n
7. å³ããå·ŠïŒRTLïŒèšèª
\n\nã¢ããªã±ãŒã·ã§ã³ãã¢ã©ãã¢èªãããã©ã€èªã®ãããªRTLèšèªããµããŒãããå¿ èŠãããå Žåãããã«åãããŠã¬ã€ã¢ãŠããèšèšããŠãã ããã`direction: rtl;`ã®ãããªCSSããããã£ã®äœ¿çšããUIèŠçŽ ã®é 眮ã®èª¿æŽãæ€èšããŠãã ããã
\n\n8. ã³ã³ãã³ãããªããªãŒãããã¯ãŒã¯ïŒCDNïŒãšããã©ãŒãã³ã¹
\n\nCDNãå©çšããŠãã¢ããªã±ãŒã·ã§ã³ã®éçã¢ã»ããïŒç»åãCSSãJavaScriptïŒããŠãŒã¶ãŒã«å°ççã«è¿ããµãŒããŒããé ä¿¡ããŸããããã«ãããåœéçãªãŠãŒã¶ãŒã®åŸ ã¡æéãççž®ãããããŒãžã®èªã¿èŸŒã¿æéãæ¹åãããŸããNext.jsã«çµã¿èŸŒãŸããŠããç»åæé©åãšCDNçµ±åã¯ãããã©ãŒãã³ã¹ãå€§å¹ ã«åäžãããããšãã§ããŸãã
\n\n9. ã°ããŒãã«åžå ŽåãSEOæé©å
\n\næ€çŽ¢ãšã³ãžã³æé©åïŒSEOïŒã¯ãäžçäžã®ãŠãŒã¶ãŒãåŒãä»ããããã«äžå¯æ¬ ã§ãã以äžã®ãã¯ããã¯ã掻çšããŠãã ããã
\n\n- \n
- èšèªåºæã®URL: ã³ã³ãã³ãã®èšèªã瀺ãããã«ãURLã«èšèªã³ãŒãïŒäŸ: `/en/`ã`/fr/`ã`/es/`ïŒã䜿çšããŸãã \n
- hreflangã¿ã°: HTMLã®``ã»ã¯ã·ã§ã³ã«`hreflang`ã¿ã°ãå®è£ ããŸãããããã®ã¿ã°ã¯ããŠã§ãããŒãžã®èšèªãšå°åã¿ãŒã²ãã£ã³ã°ãæ€çŽ¢ãšã³ãžã³ã«äŒããŸããããã¯ãæ€çŽ¢çµæã«ã³ã³ãã³ãã®æ£ããããŒãžã§ã³ã衚瀺ãããããã«ããããã«äžå¯æ¬ ã§ãã \n
- ã¡ã¿ãã£ã¹ã¯ãªãã·ã§ã³ãšã¿ã€ãã«ã¿ã°: åèšèªãšå°åã«åãããŠã¡ã¿ãã£ã¹ã¯ãªãã·ã§ã³ãšã¿ã€ãã«ã¿ã°ãæé©åããŸãã \n
- ã³ã³ãã³ãã®å質: ã¿ãŒã²ãããªãŒãã£ãšã³ã¹ã«é¢é£ããé«å質ã§ãªãªãžãã«ãªã³ã³ãã³ããæäŸããŸãã \n
- ãŠã§ããµã€ãã®é床: ãŠã§ããµã€ãã®é床ã¯éèŠãªã©ã³ãã³ã°èŠå ã§ãããããæé©åããŸããNext.jsã®ããã©ãŒãã³ã¹æé©åãæŽ»çšããŠãã ããã \n
`Layout`ã³ã³ããŒãã³ãã®`
`å ã®hreflangã¿ã°ã®äŸ:\n\n
\n<Head>\n <title>{t('layout.title', { title })}</title>\n <meta name=\"description\" content={t('layout.description')} />\n <link rel=\"alternate\" href=\"https://www.example.com/\" hreflang=\"x-default\" /> {\n <link rel=\"alternate\" href=\"https://www.example.com/en/\" hreflang=\"en\" />\n <link rel=\"alternate\" href=\"https://www.example.com/fr/\" hreflang=\"fr\" />\n // More language variants\n</Head>\n
é«åºŠãªã¬ã€ã¢ãŠãæŠç¥
\n\n1. ã³ãŒãåå²ãšã¬ã€ã¢ãŠã
\n\nNext.jsã¯ããã©ãŒãã³ã¹ãåäžãããããã«èªåçã«ã³ãŒãåå²ãå®è¡ããŸãããç¹ã«ã¬ã€ã¢ãŠãå ã§åçã€ã³ããŒãã䜿çšããããšã§ããã®åäœã埮調æŽã§ããŸãããã倧ããªã³ã³ããŒãã³ããåçã«ã€ã³ããŒãããããšã§ãåæã®JavaScriptãã³ãã«ãµã€ãºãæžãããåæããŒãæéãççž®ã§ããŸãã
\n\n
\nimport dynamic from 'next/dynamic';\n\nconst DynamicComponent = dynamic(() => import('../components/LargeComponent'));\n\nfunction Layout({ children }) {\n return (\n <>\n <header>...</header>\n <main>\n {children}\n <DynamicComponent /> <!-- Dynamically loaded component -->\n </main>\n <footer>...</footer>\n </>\n );
}\n
ãã®äŸã§ã¯ã`LargeComponent`ã¯åçã«ããŒããããŸããåçã€ã³ããŒãã¯ããã®ã³ã³ããŒãã³ããå®éã«å¿ èŠã«ãªããŸã§ããŠã³ããŒããé å»¶ãããŸãã
\n\n2. ãµãŒããŒãµã€ãã¬ã³ããªã³ã°ïŒSSRïŒã«ããã¬ã€ã¢ãŠã
\n\nNext.jsã®SSRæ©èœã䜿çšãããšããµãŒããŒã§ã³ã³ãã³ããããªã¬ã³ããªã³ã°ã§ããSEOãšåæããŒãæéãæ¹åããŸããã¬ã€ã¢ãŠãå ã§SSRãå®è£ ããŠãããŒãžãã¯ã©ã€ã¢ã³ãã«é ä¿¡ãããåã«ããŒã¿ããã§ããã§ããŸããããã¯ãé »ç¹ã«å€æŽãããã³ã³ãã³ããæ€çŽ¢ãšã³ãžã³ã«ãã£ãŠã€ã³ããã¯ã¹ä»ããããã¹ãã³ã³ãã³ãã«ãšã£ãŠç¹ã«éèŠã§ãã
\n\nããŒãžå ã§`getServerSideProps`ã䜿çšãããšãããŒã¿ãã¬ã€ã¢ãŠãã«æž¡ãããšãã§ããŸãã
\n\n
\n// pages/posts/[id].js\nimport Layout from '../../components/Layout';\n\nexport async function getServerSideProps(context) {\n const { id } = context.params;\n const res = await fetch(`https://api.example.com/posts/${id}`);\n const post = await res.json();\n\n return {\n props: {\n post,\n },\n };\n}\n\nfunction PostPage({ post }) {\n return (\n <Layout title={post.title}>\n <h1>{post.title}</h1>\n <p>{post.content}</p>\n </Layout>\n );\n}\n\nexport default PostPage;\n
`getServerSideProps`颿°ã¯æçš¿ããŒã¿ããã§ããããŸãã`post`ããŒã¿ã¯ããã®åŸpropsãšããŠ`Layout`ã«æž¡ãããŸãã
\n\n3. éçãµã€ãçæïŒSSGïŒã«ããã¬ã€ã¢ãŠã
\n\né »ç¹ã«å€ãããªãã³ã³ãã³ãã®å ŽåãSSGã¯å€§ããªããã©ãŒãã³ã¹äžã®å©ç¹ãæäŸããŸãããã«ãæã«ããŒãžãããªã¬ã³ããªã³ã°ãããŠãŒã¶ãŒã«çŽæ¥é ä¿¡ãããéçHTMLãã¡ã€ã«ãçæããŸããSSGã䜿çšããã«ã¯ãããŒãžã³ã³ããŒãã³ãã«`getStaticProps`颿°ãå®è£ ããããŒã¿ãã¬ã€ã¢ãŠãã«æž¡ãããšãã§ããŸãã
\n\n
\n// pages/about.js\nimport Layout from '../components/Layout';\n\nexport async function getStaticProps() {\n const aboutData = { title: 'About Us', content: 'Some information about our company.' };\n return {\n props: {\n aboutData,\n },\n };\n}\n\nfunction AboutPage({ aboutData }) {\n return (\n <Layout title={aboutData.title}>\n <h2>{aboutData.title}</h2>\n <p>{aboutData.content}</p>\n </Layout>\n );\n}\n\nexport default AboutPage;\n
ãã®SSGã®äŸã§ã¯ã`getStaticProps`ããã«ãæã«ããŒã¿ããã§ãããã`AboutPage`ã«æž¡ããããã®åŸ`Layout`ã³ã³ããŒãã³ãã䜿çšããŠã¬ã³ããªã³ã°ãããŸãã
\n\n4. ãã¹ããããã¬ã€ã¢ãŠã
\n\nè€éãªã¢ããªã±ãŒã·ã§ã³ã§ã¯ããã¹ããããã¬ã€ã¢ãŠããå¿ èŠã«ãªãå ŽåããããŸããããã¯ãã¬ã€ã¢ãŠãã®äžã«ã¬ã€ã¢ãŠããããããšãæå³ããŸããããšãã°ãã¡ã€ã³ã®ã¢ããªã±ãŒã·ã§ã³ã¬ã€ã¢ãŠããããããŠã§ããµã€ãã®ç¹å®ã®ã»ã¯ã·ã§ã³ã«ç°ãªãã¬ã€ã¢ãŠãã䜿çšããããšãã§ããŸããããã«ããããŠãŒã¶ãŒã€ã³ã¿ãŒãã§ãŒã¹ã现ããå¶åŸ¡ã§ããŸãã
\n\n
\n// components/MainLayout.js\nfunction MainLayout({ children }) {\n return (\n <>\n <header>Main Header</header>\n <main>{children}</main>\n <footer>Main Footer</footer>\n </>\n );\n}\n\nexport default MainLayout;\n
\n// components/SectionLayout.js\nfunction SectionLayout({ children }) {\n return (\n <div className=\"section-wrapper\">\n <aside>Section Navigation</aside>\n <div className=\"section-content\">{children}</div>\n </div>\n );\n}\n\nexport default SectionLayout;\n
\n// pages/section/[page].js\nimport MainLayout from '../../components/MainLayout';\nimport SectionLayout from '../../components/SectionLayout';\n\nfunction SectionPage({ page }) {\n return (\n <MainLayout>\n <SectionLayout>\n <h1>Section Page: {page}</h1>\n <p>Content for section page {page}.</p>\n </SectionLayout>\n </MainLayout>\n );\n}\n\nexport async function getServerSideProps(context) {\n const { page } = context.query;\n return {\n props: {\n page,\n },\n };\n}\n\nexport default SectionPage;\n
ãã®å Žåã`SectionPage`ã¯`MainLayout`ãš`SectionLayout`ã®äž¡æ¹ã«ã©ããããããã¹ããããã¬ã€ã¢ãŠãæ§é ãäœæãããŸãã
\n\nãã¹ããã©ã¯ãã£ã¹ãšæé©åã®ãã³ã
\n\n1. ã³ã³ããŒãã³ãã³ã³ããžã·ã§ã³
\n\nã³ã³ããŒãã³ãã³ã³ããžã·ã§ã³ã掻çšããŸããã¬ã€ã¢ãŠããšUIèŠçŽ ãããå°ãããåå©çšå¯èœãªã³ã³ããŒãã³ãã«åå²ããŸããããã«ãããã³ãŒãã®å¯èªæ§ãšä¿å®æ§ãåäžããŸãã
\n\n2. ããã©ãŒãã³ã¹ã¢ãã¿ãªã³ã°
\n\nGoogle LighthouseãWebPageTestãªã©ã®ããŒã«ã䜿çšããŠãã¬ã€ã¢ãŠããšã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ãç¶ç¶çã«ç£èŠããŸãããããã®ããŒã«ã¯ãããã©ãŒãã³ã¹ã®ããã«ããã¯ãšæé©åã®é åãç¹å®ããã®ã«åœ¹ç«ã¡ãŸãã
\n\n3. ãã£ãã·ã³ã°æŠç¥
\n\nãµãŒããŒã®è² è·ã軜æžããå¿çæéãæ¹åããããã«ãã£ãã·ã³ã°æŠç¥ãå®è£ ããŸããé »ç¹ã«ã¢ã¯ã»ã¹ãããããŒã¿ã®ãã£ãã·ã³ã°ãéçã¢ã»ããã®ãã©ãŠã¶ãã£ãã·ã³ã°ã®å©çšããŠãŒã¶ãŒã«è¿ãå Žæã§ã³ã³ãã³ãããã£ãã·ã¥ããããã®ã³ã³ãã³ãããªããªãŒãããã¯ãŒã¯ïŒCDNïŒã®å®è£ ãæ€èšããŠãã ããã
\n\n4. é å»¶èªã¿èŸŒã¿
\n\nç»åããã®ä»ã®éã¯ãªãã£ã«ã«ãªã³ã³ããŒãã³ãã«ã¯é å»¶èªã¿èŸŒã¿ãæ¡çšããŸãããã®ã¢ãããŒãã¯ããªãœãŒã¹ãå¿ èŠã«ãªããŸã§èªã¿èŸŒã¿ãé ãããåæããŒãžã®èªã¿èŸŒã¿æéãççž®ããŸãã
\n\n5. éå°ãªåã¬ã³ããªã³ã°ã®åé¿
\n\näžèŠãªåã¬ã³ããªã³ã°ãé¿ããããã«ã³ã³ããŒãã³ããæé©åããŸãã`React.memo`ã`useMemo`ã`useCallback`ã䜿çšããŠã³ã³ããŒãã³ããšé¢æ°ãã¡ã¢åããŸãããªã¹ããã¬ã³ããªã³ã°ããéã«ã¯ãReactã倿Žãå¹ççã«èå¥ã§ããããã«`key`ããããã£ãé©åã«å©çšããŸãã
\n\n6. ãã¹ã
\n\næåŸ éãã«æ©èœããäžè²«ããåäœãç¶æããããã«ããŠããããã¹ããçµ±åãã¹ããå«ãã¬ã€ã¢ãŠãã³ã³ããŒãã³ãã®åŸ¹åºçãªãã¹ãã宿œããŸããç°ãªãç»é¢ãµã€ãºããã±ãŒã«ã§ã®ã¬ã€ã¢ãŠãããã¹ãããŸãã
\n\nçµè«
\n\nNext.jsã¬ã€ã¢ãŠãã¯ãåªãããŠã§ãã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããããã®åŒ·åã§å€æ©èœãªããŒã«ãæäŸããŸãããã®ã¬ã€ãã§èª¬æãããŠãããã¯ããã¯ãç¿åŸããããšã§ãæ§é ãè¯ããä¿å®å¯èœã§ãããã©ãŒãã³ã¹ã®é«ãUIãäœæã§ããŸããã¢ããªã±ãŒã·ã§ã³ãã°ããŒãã«ãªãŠãŒã¶ãŒã«é¿ãããã«ãåœéåãšã°ããŒãã«åã®ãã¹ããã©ã¯ãã£ã¹ãåãå ¥ããããšãå¿ããªãã§ãã ãããNext.jsã®åãšææ ®æ·±ãã¬ã€ã¢ãŠããžã®ã¢ãããŒããçµã¿åãããããšã§ãçŸä»£çã§ã¹ã±ãŒã©ãã«ãªãæ®éçã«ã¢ã¯ã»ã¹å¯èœãªãŠã§ããšã¯ã¹ããªãšã³ã¹ãäœæããããã®æºåãæŽããŸãã